#include "parser_impl.h"
#include "lexer.h"
#include "error.h"
#include "table.h"


double expr(bool get)		//表达式分析开始以及处理'+'、'-'运算（符）
{
	double left = term(get);		//left表示'+'、'-'的左边结果 

	for (;;)  						//无穷循环 
		switch (Lexer::curr_tok) {
		case Lexer::PLUS:
			left += term(true);//调用term()得到'+'的右边结果，'+'运算后结果保存在left中 
			break;
		case Lexer::MINUS:
			left -= term(true);
			break;
		default:
			return left;
		}
}

//page:110
double term(bool get)		//处理'*'、'/'运算（符）
{

	double left = prim(get);		//left表示'*'、'/'的左边结果 

	for (;;)
		switch (Lexer::curr_tok) {
		case Lexer::MUL:
			left *= prim(true);//调用term()得到'*'的右边结果，'*'运算后结果保存在left中
			break;
		case Lexer::DIV:				//除数不能为0 
			if (double d = prim(true)) {
				left /= d;
				break;
			}
			return Error::error("divide by 0");
		default:
			return left;
		}
}

double prim(bool get) //处理表达式中的基本项,如：25,pi,x,-25,-pi,-x,(pi*2+3.5) 
{
	if (get) Lexer::get_token();	//调用get_token()获取一个记号（符号）给curr_tok 

	switch (Lexer::curr_tok) {
	case Lexer::NUMBER: {		//浮点数常量  
		double v = Lexer::number_value;
		Lexer::get_token();
		return v;
	}
	case Lexer::NAME: {		//命名常量或变量的名字 
		double& v = table[Lexer::string_value];  //已定义的命名常量 
		if (Lexer::get_token() == Lexer::ASSIGN)		//名字后跟赋值运算符，是变量名 
			v = expr(true); 			//获得变量的值(也是一个表达式)
		return v;
	}
	case Lexer::MINUS: {		//取负
		return -prim(true);
	}
	case Lexer::LP: {		//左括号 
		double e = expr(true);
		if (Lexer::curr_tok != Lexer::RP) return Error::error(") expected");
		Lexer::get_token();  //扔掉')'
		return e;
	}
	default:
		return Error::error("primary expected");
	}
}